package org.sysdance.aplicativo.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;

import org.sysdance.aplicativo.entidade.AlunoTurmaCurso;
import org.sysdance.aplicativo.entidade.Frequencia;
import org.sysdance.aplicativo.excecao.ConexaoException;
import org.sysdance.aplicativo.excecao.DAOException;
import org.sysdance.aplicativo.integracao.FrequenciaIntegracao;
import org.sysdance.aplicativo.util.ConexaoUtil;
import org.sysdance.aplicativo.util.ResultSetUtil;
import org.sysdance.aplicativo.util.SysDanceUtil;

public class FrequenciaDAO implements FrequenciaIntegracao {

	@Override
	public void inserirFrequencia(Frequencia frequencia) throws DAOException {
		final StringBuilder sql = new StringBuilder();
        sql.append("INSERT INTO frequencia(id_frequencia, id_aluno_turma_curso, dt_frequencia, frequencia) ");
        sql.append("VALUES (NEXTVAL('frequencia_id_frequencia_seq'), ?, ?, ?);");
        try {
            final Connection conexao = ConexaoUtil.criarNovaConexao();
            final PreparedStatement ps = conexao.prepareStatement(sql.toString(),new String[]{"id_aluno_turma_curso"});
            ps.setInt(1,frequencia.getIdAlunoTurmaCurso());
            ps.setDate(2, new Date(frequencia.getDtFrequencia().getTime()));
            ps.setBoolean(3, frequencia.isFrequencia());
            ps.executeUpdate();
        } catch (final ConexaoException ex) {
            SysDanceUtil.getInstancia().imprimirLog(ex);
            throw new DAOException(ex.getMessage());
        } catch (final SQLException sqlex) {
            SysDanceUtil.getInstancia().imprimirLog(sqlex);
            throw new DAOException(sqlex.getMessage());
        }finally{
        	try {
				ConexaoUtil.fecharConexao();
			} catch (ConexaoException e) {
				SysDanceUtil.getInstancia().imprimirLog(e);
			}
        }
	}
	
	@Override
	public Boolean isJaExisteFrequenciaPorData(Frequencia frequencia) throws DAOException {
		final StringBuilder sql = new StringBuilder();
        sql.append("SELECT * FROM frequencia INNER JOIN aluno_turma_curso ");
        sql.append("ON frequencia.id_aluno_turma_curso = aluno_turma_curso.id_aluno_turma_curso ");
        sql.append("WHERE frequencia.id_aluno_turma_curso=? AND frequencia.dt_frequencia=? AND aluno_turma_curso.id_aluno=? AND aluno_turma_curso.id_turma=?;");
        try {
            final Connection conexao = ConexaoUtil.criarNovaConexao();
            final PreparedStatement ps = conexao.prepareStatement(sql.toString());
            ps.setInt(1, frequencia.getIdAlunoTurmaCurso());
            ps.setDate(2, new Date(new SimpleDateFormat("yyyy-MM-dd").parse(new SimpleDateFormat("yyyy-MM-dd").format(frequencia.getDtFrequencia())).getTime()));
            ps.setInt(3, frequencia.getAlunoTurmaCurso().getAluno().getIdAluno());
            ps.setInt(4, frequencia.getAlunoTurmaCurso().getTurma().getIdTurma());
            final ResultSet rs = ps.executeQuery();
           return rs.next();
        } catch (final ConexaoException ex) {
            SysDanceUtil.getInstancia().imprimirLog(ex);
            throw new DAOException(ex.getMessage());
        } catch (final SQLException sqlex) {
            SysDanceUtil.getInstancia().imprimirLog(sqlex);
            throw new DAOException(sqlex.getMessage());
        } catch (ParseException e) {
        	SysDanceUtil.getInstancia().imprimirLog(e);
            throw new DAOException(e.getMessage());
		}finally{
        	try {
				ConexaoUtil.fecharConexao();
			} catch (ConexaoException e) {
				SysDanceUtil.getInstancia().imprimirLog(e);
			}
        }
	}
	
	@Override
	public Boolean isAlunoFrequente(AlunoTurmaCurso alunoTurmaCurso,java.util.Date dataFrequencia) {
		final StringBuilder sql = new StringBuilder();
        sql.append("SELECT frequencia FROM frequencia ");
        sql.append("WHERE id_aluno_turma_curso=? AND dt_frequencia=?;");
        try {
            final Connection conexao = ConexaoUtil.criarNovaConexao();
            final PreparedStatement ps = conexao.prepareStatement(sql.toString());
            ps.setInt(1, alunoTurmaCurso.getIdAlunoTurmaCurso());
            ps.setDate(2, new Date(dataFrequencia.getTime()));
            final ResultSet rs = ps.executeQuery();
            if(rs.next()){
            	return rs.getBoolean("frequencia");
            }else{
            	return Boolean.FALSE;
            }
        } catch (final ConexaoException ex) {
            SysDanceUtil.getInstancia().imprimirLog(ex);
        } catch (final SQLException sqlex) {
            SysDanceUtil.getInstancia().imprimirLog(sqlex);
        }finally{
        	try {
				ConexaoUtil.fecharConexao();
			} catch (ConexaoException e) {
				SysDanceUtil.getInstancia().imprimirLog(e);
			}
        }
        return Boolean.FALSE;
	}
	
	@Override
	public Frequencia consultarFrequencia(AlunoTurmaCurso alunoTurmaCurso,java.util.Date dataFrequencia) {
		final StringBuilder sql = new StringBuilder();
        sql.append("SELECT * FROM frequencia ");
        sql.append("WHERE id_aluno_turma_curso=? AND dt_frequencia=?;");
        try {
            final Connection conexao = ConexaoUtil.criarNovaConexao();
            final PreparedStatement ps = conexao.prepareStatement(sql.toString());
            ps.setInt(1, alunoTurmaCurso.getIdAlunoTurmaCurso());
            ps.setDate(2, new Date(dataFrequencia.getTime()));
            final ResultSet rs = ps.executeQuery();
           	return ResultSetUtil.extrairUnicoRegistro(rs, Frequencia.class);
        } catch (final ConexaoException ex) {
            SysDanceUtil.getInstancia().imprimirLog(ex);
        } catch (final SQLException sqlex) {
            SysDanceUtil.getInstancia().imprimirLog(sqlex);
        }finally{
        	try {
				ConexaoUtil.fecharConexao();
			} catch (ConexaoException e) {
				SysDanceUtil.getInstancia().imprimirLog(e);
			}
        }
        return null;
	}
	
	@Override
	public void atualizarFrequencia(Frequencia frequencia) throws DAOException {
		final StringBuilder sql = new StringBuilder();
        sql.append("UPDATE frequencia SET frequencia=? ");
        sql.append("WHERE id_frequencia=?;");
        try {
            final Connection conexao = ConexaoUtil.criarNovaConexao();
            final PreparedStatement ps = conexao.prepareStatement(sql.toString(),new String[]{"id_aluno_turma_curso"});
            ps.setBoolean(1, frequencia.isFrequencia());
            ps.setInt(2,frequencia.getIdFrequencia());
            ps.executeUpdate();
        } catch (final ConexaoException ex) {
            SysDanceUtil.getInstancia().imprimirLog(ex);
            throw new DAOException(ex.getMessage());
        } catch (final SQLException sqlex) {
            SysDanceUtil.getInstancia().imprimirLog(sqlex);
            throw new DAOException(sqlex.getMessage());
        }finally{
        	try {
				ConexaoUtil.fecharConexao();
			} catch (ConexaoException e) {
				SysDanceUtil.getInstancia().imprimirLog(e);
			}
        }
	}

}
